// 据每日气温列表，请重新生成一个列表，对应位置的输出是需要再等待多久温度才会升高超过该日的天数。
// 如果之后都不会升高，请在该位置用 0 来代替

// 使用栈结构可以帮我们避免不必要的操作
// 避免重复操作的秘诀就是及时地将不必要的数据出栈，避免它对我们后续的遍历产生干扰。

// 拿这道题来说，我们的思路就是：尝试去维持一个递减栈。
// 当遍历过的温度，维持的是一个单调递减的态势时，我们就对这些温度的索引下标执行入栈操作；
// 只要出现了一个数字，它打破了这种单调递减的趋势，也就是说它比前一个温度值高，
// 这时我们就对前后两个温度的索引下标求差，得出前一个温度距离第一次升温的目标差值
/**
 *
 * @param T 入参是温度数组
 */
const dailyTemperatures = (T: Array<number>) => {
  // 缓存数组的长度
  const len = T.length;
  // 创建一个递减栈,保存索引
  const stack: Array<number> = [];
  // 初始化结果数组,数组定长切初始值为0
  const res = new Array(len).fill(0);
  //
  for (let index = 0; index < len; index++) {
    // 若栈不为0 ,且存在打破递减趋势的温度值
    while (stack.length && T[index] > T[stack[stack.length - 1]]) {
      // 将栈顶对应温度的索引值出站
      const top = stack.pop();
      //  计算 当前栈顶温度值与第一个高于它的温度值 的索引差值
      if (top) res[top] = index - top;
    }
    // 注意栈里存的不是温度值，而是索引值，这是为了后面方便计算
    stack.push(index);
  }
  return res;
};
